#include "sqlopera.h"

sqlOpera::sqlOpera()
{

}

void 创建新表(QString ini文件, QString db文件, QString 表名)
{
 //   db文件="qtDB4.db";
 //   表名="字详表2";
    QString 建表sql;

    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE");//以“QSQLITE”为数据库类型，在本进程地址空间内创建一个SQLite数据库。
 //   db.setHostName("easybook-0001");          //设置数据库主机名
    db.setDatabaseName(db文件);              //设置数据库名
   // db.setUserName("HPC");                //设置数据库用户名
  //  db.setPassword("123456");                   //设置数据库密码
    db.open();                             		//打开连接

QStringList 查表一=ini读尖括号格式(ini文件,"<~>");//查询新建表的列名.
QStringList 查表二=ini读尖括号格式(ini文件,"<`>");//查询ID是用户指定还是自动递增.
//qDebug() << "具体的键名一"<<查表一;
//qDebug() << "具体的键名二"<<查表二;

#pragma region {///建表sql语句生成
    建表sql="CREATE TABLE "+表名+" (";   // 0) 表名 完成
    建表sql+="ID INTEGER PRIMARY KEY ";

    {//确定ID是 "用户指定" 还是 "自动递增".
        int index=-1;
        index = 查表二[0].indexOf("自动递增");//查表二的第一个元素存放"用户指定" 还是 "自动递增".
        if(index != -1)
            建表sql+="AUTOINCREMENT ";
    }

    建表sql+="UNIQUE  NOT NULL,";       // 2) ID 完成
    建表sql+=查表一[1]+" TEXT NOT NULL,";// 3) 第二列 不能为空, 是词典的要查询的词.

    for(int i=2; i<查表一.length(); i++)//前面已添加两个字段,即ID和字.
    {
        建表sql+=查表一[i]+" TEXT,";
    }

    //下面的4个字段是每个表我都要求要有的.
    建表sql+="用户查询次数zi INTEGER,";//后面加个zi是为了防止重名
    建表sql+="用户查询历史zi TEXT,";
    建表sql+="用户标签zi TEXT,";
    建表sql+="用户备注zi TEXT)";

#pragma endregion }///建表sql语句生成

            //创建数据库表
    QSqlQuery query;
    bool success=query.exec(建表sql);

    if(success)
        qDebug()<<QObject::tr("数据库表创建成功！\n");
    else
        qDebug()<<QObject::tr("数据库表创建失败！\n");

    //查询
    query.exec("select * from 字详表");
    QSqlRecord rec = query.record();
    qDebug() << QObject::tr("automobil表字段数：" )<< rec.count();


/*
//        //创建数据库表
//    QSqlQuery query;
//    bool success=query.exec("CREATE TABLE 字详表2 ("
//                              "ID INTEGER PRIMARY KEY AUTOINCREMENT  UNIQUE  NOT NULL,"
//                              "字      TEXT    NOT NULL,"
//                              "字级     TEXT,"
//                              "结构     TEXT,"
//                              "笔画     TEXT,"
//                              "部首     TEXT,"
//                              "拼音     TEXT,"
//                              "正文     TEXT,"
//                              "另见     TEXT,"
//                              "文字源流   TEXT,"
//                              "辨析     TEXT,"
//                              "字的故事   TEXT,"
//                              "图示     TEXT,"
//                              "书写体    TEXT,"
//                              "用户查询次数 INTEGER,"
//                              "用户查询历史 TEXT,"
//                              "用户标签   TEXT,"
//                              "用户备注   TEXT)");
//    if(success)
//        qDebug()<<QObject::tr("数据库表创建成功！\n");
//    else
//        qDebug()<<QObject::tr("数据库表创建失败！\n");

//    //查询
//    query.exec("select * from 字详表");
//    QSqlRecord rec = query.record();
//    qDebug() << QObject::tr("automobil表字段数：" )<< rec.count();
*/
    db.close();                             		//关闭连接

}


QString html缩标存储方式(QString ini文件, QString db文件, QString html元素)
{
    QString SQL元素值;
    int index=html元素.indexOf("<");
    if(index == -1)//不是html标签, 直接写入.
    {   SQL元素值+=html元素; }
    else//是html标签
    {
        int index1=-2;
        int index2=-2;
        index1=html元素.indexOf("<a ");
        index2=html元素.indexOf("<img ");//<img src=\"D:/QtF/SQLasBOOK/词典/photo/image.png\" title=\"音频1@D:/CloudMusic/夏天的风.mp3\" width=\"50\" height=\"20\" />  格式 0@ 1@ 2@ 3@

        //<a和<img不会同时存在 拆分后的html元素[i] 中
        if(index1==0)//找到  <a 不缩标签
        {
            SQL元素值+=html元素;//是"<a "
        }
        else if(index2==0)//找到 "<img "
        {
            SQL元素值+=img标签存储方式(db文件, html元素);//<img特有的缩短方式
            qDebug()<<"SQL元素aaa"<<SQL元素值;
        }
        else
        {
            SQL元素值+=ini写入html标签(ini文件,html元素);//缩短标签.
        }
   }
    return SQL元素值;

}

///ini文件 输入数据库中表的段名
QString 表添加词条数据(QString ini文件, QString db文件, QString 表名, QString 文本)
{
    // 按行分割文本
    QStringList 表内容 = 文本.split("\n");

    QStringList ini第三行= ini读尖括号格式(ini文件, "<^>");//表的类型是词典还是笔记
    QString SQL列名  ="INSERT INTO ";
            SQL列名 +=表名+" (";

    QString SQL元素值="VALUES(";
    QString 返回信息;

    int 表内容第几行=0;
    int index = -1;
    QStringList html元素;//拆分后的html元素

if(ini第三行.length()>0)//必须有元素才比较是笔记还是词典, 否则查[0]时数组越界.
{
    if(ini第三行[0]=="笔记")
    {
        ///这个for循环是找标题的
        bool 没找到标题=true;
        for(; 表内容第几行<表内容.length(); 表内容第几行++)//遍历整篇文件
        {
            html元素 = 单行html元素拆分(表内容[表内容第几行]);
            if(没找到标题)
            {
                for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签
                {
                    index=html元素[i].indexOf("<p ");
                    if(index != -1)
                    {
                        SQL列名 +="标题,";
                        没找到标题=false;
                        break;
                    }
                }
                if(!没找到标题)//如果在上面的for循环中找到了<p 即标题, 将该行元素都加入到sql语句中.
                {
                    for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签
                    {
                        if(i==0)
                        {   SQL元素值+="'";  }//sql字符元素需要用 ' 号括起来.

                        SQL元素值+=html缩标存储方式(ini文件, db文件,html元素[i]);
                    }
                    表内容第几行++;
                    break;//已完成标题的一行元素添加, 跳出 遍历整篇文件 的循环, 开始找正文.
                }
            }
            if(表内容.length()==表内容第几行+1)   return 返回信息="添加失败, 没有标题";//如果整篇文章都没找到标题,就不添加词条了.
        }

         SQL列名 +="正文";
         SQL元素值+="','";
        ///这个for循环是找正文的
        for(; 表内容第几行<表内容.length(); 表内容第几行++)//遍历整篇文件
        {
            html元素 = 单行html元素拆分(表内容[表内容第几行]);
            for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签
            {
                if(html元素[i] != "</body>")
                {
                    SQL元素值+=html缩标存储方式(ini文件, db文件,html元素[i]);
                }
                else
                {    break;}
            }
        }

        SQL列名+=") ";
        SQL元素值+="')";
        qDebug()<<"SQL列名aa"<<SQL列名;
        qDebug()<<"SQL元素值aa"<<SQL元素值;


        SQL列名+=SQL元素值;
        //qDebug()<<"SQL列名aa"<<SQL列名;
        //SQL列名="INSERT INTO 字详表 (ID,字,字级,结构,笔画,部首,读音) VALUES(000002,'<~~><~`>帅</span></p>','<~~><~^>\t<~->一级</span>','<~+><~->左右</span>','<~*><~->6画</span>','<~&><~->阝</span></p>','工')";
        //SQL列名="INSERT INTO 字详表 (ID,字) VALUES(109,'革')";

        sql写操作(db文件, SQL列名);
        return 返回信息="添加成功";
    }

    QStringList ini第一行= ini读尖括号格式(ini文件, "<~>");//表的列名
    QStringList ini第二行= ini读尖括号格式(ini文件, "<`>");//ID递增方式和是否显示, 列间的换行
    表内容第几行=0;
    index = -1;
    QString 单个文本;

    if(ini第三行[0]=="词典")
    {

        //遍历整篇文件, 找到 ---ID 出现的位置, 即列名的位置
        for(; 表内容第几行<表内容.length(); 表内容第几行++)
        {
            html元素 = 单行html元素拆分(表内容[表内容第几行]);
            for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签
            {
                index=html元素[i].indexOf("---ID");
                if(index>=0 && index<2)//防止-号前有空格,也防止这行不是ID, 所以要加个小于2
                {
                    表内容第几行++;
                    index = -1;
                    if(ini第二行.length()>0) {index=ini第二行[0].indexOf("用户指定");}
                    if(index != -1)//如果是用户指定, 需记录下一行的ID数字.
                    {
                        index = -2;
                        html元素 = 单行html元素拆分(表内容[表内容第几行]);
                        for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签, 找出ID的数字
                        {
                            index=html元素[i].indexOf("<");
                            if(index == -1)//找到的不是html标签了, 就当作有ID数字
                            {
                                单个文本=html元素[i].remove(QRegExp("\\s+"));  //去除所有空格
                                SQL列名+="ID,";
                                SQL元素值+=单个文本+",";//是数值, 不需要 ' ' 单引号
                                goto 找到第ID了;//ini中是用户指定时的跳转
                            }
                        }
                    }
                    goto 找到第ID了;//ini中不是用户指定时的跳转
                }
            }
        }
找到第ID了:
        表内容第几行++;//跳过ID格式行 或ID数字行
        QString 不换行符;
        int 不换行次数=0;
        bool 找到列名=false;


         int SQL元素个数=0;

        //遍历整篇文件, 开始找列名
        for(; 表内容第几行<表内容.length(); )//表内容第几行++)
        {
            html元素 = 单行html元素拆分(表内容[表内容第几行]);
            for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签, 这个是为了找到列名
            {

                index=-1;
                index=html元素[i].indexOf("---");
                if(index>=0 && index<2)//防止-号前有空格,也防止这行不是ID, 所以要加个小于2
                {
                    单个文本=html元素[i].replace('-', ' ');  // - 号替换为空格
                    单个文本=单个文本.remove(QRegExp("\\s+"));  //去除所有空格
                    index=单个文本.indexOf("\\");
                    单个文本=单个文本.mid(0,index);//截取\号之前的

                    for(int j=0;j<ini第一行.length();j++)
                    {
                        if(单个文本 == ini第一行[j])//说明找到了列名
                        {
                            SQL列名+=ini第一行[j]+",";
                            不换行符=ini第二行[j];//可能为\号, 也可能为空
                            找到列名=true;
                            if(SQL元素个数==0)
                            {
                                SQL元素值+="'";
                                SQL元素个数++;
                            }
                            else
                            {
                                SQL元素值+="','";
                                SQL元素个数++;
                            }

                            goto 找到列名;
                        }
                    }
                }
            }
找到列名:
//qDebug()<<"八八八"<<html元素;
            bool 这行不是列名=true;
            if(找到列名)
            {
                表内容第几行++;
                if(表内容第几行==表内容.length())
                {
                    goto 全部找完了;
                }
                html元素 = 单行html元素拆分(表内容[表内容第几行]);

                //目的:  这个for循环是为了防止列名接列名, 或列名是最后一行.
                //实际:  过滤掉是列名的一行, 为什么是这样我也想不明白了.
                for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签, 这个是为了找到列名, 这个循环是为了防止上一行列名后也是列名或是或列名后最后一行
                {
                    index=-1;
                    index=html元素[i].indexOf("---\\\\");//  符号---\\是结束符
                    if(index != -1) {goto 全部找完了; qDebug()<<"全部找到了";}

                    index=-1;
                    index=html元素[i].indexOf("---");
                    if(index>=0 && index<2)//防止-号前有空格,也防止这行不是ID, 所以要加个小于2
                    {
                        单个文本=html元素[i].replace('-', ' ');  // - 号替换为空格
                        单个文本=单个文本.remove(QRegExp("\\s+"));  //去除所有空格

                        index=单个文本.indexOf("\\");
                        单个文本=单个文本.mid(0,index);//截取\号之前的

                        for(int j=0;j<ini第一行.length();j++)
                        {

                            if(单个文本 == ini第一行[j])//说明找到了列名
                            {
                                这行不是列名=false;
                                break;
                            }
                        }
                    }
                }
                if(这行不是列名)
                {
                    int 换行状态=0;
                    if(不换行符=="\\"  && 不换行次数 >0)//第二次或以上遇到不换行
                    {
                        换行状态 = 2;
                        不换行次数++;
                    }
                    if(不换行符=="\\"  && 不换行次数 ==0)//第一次遇到不换行, 必须把 换行状态 = 1 放到第二个if中
                    {
                        换行状态 = 1;
                        不换行次数++;
                    }
                    if(不换行符!="\\"  && 不换行次数 ==0)//没有遇到不换行
                    {
                        换行状态 = 0;
                        不换行次数=0;
                    }
                    if(不换行符!="\\"  && 不换行次数 >0)//最后一次遇到不换行, 必须把这条件放到最后, 不能跟 换行状态 = 0 的那个条件位置, 否则两次都执行到if语句, 换行状态只能是0
                    {
                        换行状态 = 3;
                        不换行次数=0;
                    }


                    ///  换行状态 = 1, 代表第一次遇到 \ 号, 则是截去最后的</p>
                    ///  换行状态 = 2,代表遇到几次了, 则是截去前面的<p>和后面的</p>
                    ///  换行状态 = 3, 代表终于最后一个同行, 则是截去前面<p>
                    ///  换行状态 = 0, 则是单独成行, 不用修改.
                    单个文本="";
                    for(int i=0 ; i<html元素.length(); i++)
                    {
                        单个文本+=html缩标存储方式(ini文件, db文件,html元素[i]);//db文件只是为了方便获得db的路径, 实际未写入db
                    }
                    if(换行状态)
                    {
                        if(换行状态==1)//则是截去最后的</p>
                        {
                            index=单个文本.lastIndexOf("<");
                            单个文本=单个文本.mid(0,index);
                        }
                        if(换行状态==2)//截去前面的<p>和后面的</p>
                        {
                            index=单个文本.indexOf(">");
                            单个文本=单个文本.mid(index+1,单个文本.length()-index-1);//截去前面的<p>
                            index=单个文本.lastIndexOf("<");
                            单个文本=单个文本.mid(0,index);//截去后面的</p>
                        }
                        if(换行状态==3)//截去前面的<p>
                        {
                            index=单个文本.indexOf(">");
                            单个文本=单个文本.mid(index+1,单个文本.length()-index-1);
                        }

                    }
                    单个文本=单个文本.replace("'", "''");  // 一个单引号替换为两个单引号, 避免写入sql时出错.
                    SQL元素值+=单个文本;
                }
            }
        }
    }
}
全部找完了:


    index=SQL列名.lastIndexOf(",");
    if(index == SQL列名.length()-1)
    {   SQL列名=SQL列名.mid(0,SQL列名.length()-1);}//删除最后的逗号

    index=SQL元素值.lastIndexOf("'");
    if(index != SQL元素值.length()-1)
    {   SQL元素值+="'";}//最后不是单引号, 加上单引号

    qDebug()<<"SQL列名aa"<<SQL列名;
    qDebug()<<"SQL元素值aa"<<SQL元素值;


    SQL列名+=") ";
    SQL元素值+=")";

    SQL列名+=SQL元素值;
    sql写操作(db文件, SQL列名);

    return 返回信息;

}

bool sql写操作(QString db文件, QString 写入的数据)
{

    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE");//以“QSQLITE”为数据库类型，在本进程地址空间内创建一个SQLite数据库。


   // db.setHostName("easybook-3313b0");          //设置数据库主机名
    db.setDatabaseName(db文件);              //设置数据库名
   // db.setUserName("zhouhejun");                //设置数据库用户名
   // db.setPassword("123456");                   //设置数据库密码
    db.open();                             		//打开连接

                //创建数据库表
    QSqlQuery query;
    bool success=query.exec(写入的数据);

    if(success)
        qDebug()<<QObject::tr("数据库表数据写入成功！\n");
    else
        qDebug()<<QObject::tr("数据库写入失败！\n");

    //查询
  //  query.exec("select * from 字详表");
  //  QSqlRecord rec = query.record();
  //  qDebug() << QObject::tr("automobil表字段数：" )<< rec.count();

    db.close();                             		//关闭连接
    return success;

}



QString 表中还原html(QString ini文件, QString db文件, QString 表名, QString ID, QString *列表词)
{
    QString 返回html;
    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE");//以“QSQLITE”为数据库类型，在本进程地址空间内创建一个SQLite数据库。

    db.setDatabaseName(db文件);              //设置数据库名
    db.open();
     if (!db.open()) {
        qDebug() << "打开数据库失败";
        return 返回html;
    }

    // 查询一条数据
    QSqlQuery query(db);

/**这段的结果给历史列表框用*********************************************************/
    QStringList 要读的列=ini读尖括号格式(ini文件, "<->");
    QString SQL语句="SELECT ";

    for(int i=0; i<要读的列.length(); i++)
    {
        SQL语句+=要读的列[i]+",";
    }
    SQL语句+="ID FROM "+表名+" WHERE ID = " +ID;
    query.exec(SQL语句);

    QSqlRecord record = query.record();
    int columnCount = record.count(); // 获取字段个数
    query.seek(0);//必须要将字段移到开头, 否则找不到记录内容.

    //得到该ID中的内容.
    for(int i=0;i<columnCount;i++)
    {
        QString 暂时文本= query.value(i).toString();
        *列表词 +=去除尖括号并限制长度(暂时文本);
        if(i+1 <columnCount)//最后一个后面不要加4个空格
        {    *列表词+="    ";  }

    }
/**这段的结果给历史列表框用*********************************************************/


    query.exec("SELECT * FROM "+表名+" WHERE ID = " +ID);


    record = query.record();
    columnCount = record.count(); // 获取字段个数
    query.seek(0);//必须要将字段移到开头, 否则找不到记录内容.

    //得到该ID中的内容.
    for(int i=0;i<columnCount;i++)
    {
        返回html += query.value(i).toString();
    }
    db.close();                             		//关闭连接


  //  QStringList ini第一行= ini读尖括号格式(ini文件, "<~>");//表的列名
    QStringList ini第二行= ini读尖括号格式(ini文件, "<`>");//ID递增方式和是否显示, 列间的换行

    QString 临时html;

    int index1 = 返回html.indexOf("<");//先截取<号之前的字符. <前的就是ID
    if(index1 > 0)//读出的是ID号
    {   QStringList 键值=ini读尖括号格式(ini文件, "<~`>");//<~`>是ID专用的格式存放位, 之前是<#>,不用了.
        临时html=键值[0];
        临时html+=返回html.mid(0,index1)+"</p>\r\n";
        返回html=返回html.mid(index1,返回html.length()-index1);
    }

    if(ini第二行.length()>0)
    {
        index1=-1;
        index1=ini第二行[0].indexOf("不显示");
        qDebug()<<"踢上上"<<index1<<临时html;
        if(index1 != -1)//如果是不显示的,则清空ID的内容和格式
        {
            临时html="";
        }
    }


//qDebug()<<"返回htmlxx"<<临时html<<返回html;
//while(0)
    while(返回html.length())
    {
        index1=-1;
        int index2 =-1;
        QString 截取的;
        index1 = 返回html.indexOf("<");
        index2 = 返回html.indexOf(">");

        if(index1== 0 && index1 < index2  )//找到的是<>的区间
        {
            截取的=返回html.mid(0 ,index2+1);
            if(截取的.length()<=8)//短标签才需要还原
            {
                QStringList 健值=ini读尖括号格式(ini文件, 截取的);
                if(健值.length()>0)
                   临时html+=健值[0];//在ini,html缩定只有一个键值.
                else//如果找不到缩写的html键名.
                   临时html+=截取的;
            }
            else
            {   int index3=截取的.indexOf("<img");
                if(index3 == -1)
                {   临时html+=截取的; }
                else//当前是<img标签
                {   临时html+=img标签还原(db文件,截取的);    }
            }

            返回html=返回html.mid(index2+1,返回html.length()-index2);//减去已截取的字符

        }
        if(index1> 0)//找到的不是<>区间
        {
            临时html+=返回html.mid(0,index1);
            返回html=返回html.mid(index1,返回html.length()-index1);
        }
        if(index1< 0)
        {
            break;
        }
//qDebug()<<"返回htmlxx"<<截取的<<临时html;
    }

    //html文件头
    返回html="<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd\">"
             "<html><head><meta name=\"qrichtext\" content=\"1\" /><style type=\"text/css\">"
             "p, li { white-space: pre-wrap; }"
             "</style></head><body style=\" font-family:'SimSun'; font-size:9pt; font-weight:400; font-style:normal;\">";
    返回html+=临时html;
    返回html+="<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;\"><br /></p>";

//后续的 修改记录,  标签,  备注  要另外新建函数加载.
//这个函数只加载 ini文件第一行所显示的列.
//修改词条的函数用到这个函数, 所有不能在这函数加载 修改记录,  标签,  备注.



    return 返回html;
}


QString img标签存储方式(QString db文件, QString img标签)
{
    QString 返回标签=img标签;//默认返回, 中途不能修改.

    int index1=-2;
    index1 = db文件.lastIndexOf("/");
    QString db路径=db文件.mid(0,index1+1);//后面的/ 号也加上

    int index2=-2;
//要编辑框中的格式 <img src=\"D:/QtF/SQLasBOOK/词典/photo/image.png\" title=\"音频1@D:/CloudMusic/夏天的风.mp3\" width=\"50\" height=\"20\" />  格式 0@ 1@ 2@ 3@
    QStringList img中元素;
    int i=0;
    while(1)//再拆分出img标签内的元素
    {
        index1 = img标签.indexOf(" ");
        index2 = img标签.indexOf("\"");
        img中元素.append(img标签.mid(index1+1,index2-index1));//空格与 " 号之间的字符串
        img标签=img标签.mid(index2+1,img标签.length()-index2-1);

        index2 = img标签.indexOf("\"");// " "之间的字符串
        img中元素[i]+=img标签.mid(0,index2+1);
        img标签=img标签.mid(index2+1,img标签.length()-index2-1);

        qDebug()<<"img=="<<img标签;
        qDebug()<<"img++"<<img中元素;

        i++;
        index2 = img标签.indexOf("\"");// 最后没有"号了,就退出
        if(index2 == -1) break;
    }

    i=img中元素.length();
    QString 存储方式;
    QString 资源类型;
    while(i)//得到 资源类型 和 存储方式;
    {
        QString 当前元素=img中元素[i-1];

        index1=当前元素.indexOf("title=\"");
        if(index1 != -1)
        {
            index2=当前元素.indexOf("@");
            if(index2 != -1)
            {
                资源类型=当前元素.mid(5,index2-5-1);
                存储方式=当前元素.mid(index2-1,1);
                break;
            }
        }
        i--;
    }

qDebug()<<"img之"<<资源类型<<存储方式;
//插入到QTextEdit, 图片肯定是绝对路径才能显示. 资源可以是绝对也可以是相对. 要用一些标记表示保存时路径是否要截短, 和读出时是否要补充.
//音频0@   图片和资源都要截断, 即复制到工作目录中.
//音频1@   图片截断, 复制到工作目录中. 资源保留原路径.
//音频2@   图片保留原路径. 资源截断, 复制到工作目录中.
//音频3@   图片和资源保留原路径.

//假设image.png和mp3都不在词典的文件中, 执行1@的操作, 就是图片复制到工作文件夹, mp3保持原位置,不复制.  在 QTextEdit的语句如下:
//<img src=\"D:/QtF/SQLasBOOK/词典/photo/image.png\" title=\"音频1@D:/CloudMusic/夏天的风.mp3\" width=\"50\" height=\"20\" />
// 保存在db的语句如下:
//<img src=\"/photo/image.png\" title=\"音频1@D:/CloudMusic/夏天的风.mp3\" width=\"50\" height=\"20\" />

    if(存储方式=="0")//等于0, 图片和资源都要截断, 即复制到工作目录中.
    {
        i=img中元素.length();

        while(i)//得到 资源类型 和 存储方式;
        {
            QString 当前元素=img中元素[i-1];
            index1=-1;
            index1=当前元素.indexOf("src=\"");
            if(index1 != -1)
            {
                img中元素[i-1]=当前元素.replace(db路径, "/");//前面的路径用 / 代换
 //qDebug()<<"img src="<<img中元素[i-1]<<db路径;
            }

            index2=-1;
            index2=当前元素.indexOf("title=\"");
            if(index2 != -1)
            {
                img中元素[i-1]=当前元素.replace(db路径, "/");//前面的路径用 / 代换
 //qDebug()<<"img title="<<img中元素[i-1]<<db路径;
            }
            i--;
        }
    }

    if(存储方式=="1")//等于1, 图片截断, 复制到工作目录中. 资源保留原路径.
    {
        i=img中元素.length();

        while(i)//得到 资源类型 和 存储方式;
        {
            QString 当前元素=img中元素[i-1];

            index1=当前元素.indexOf("src=\"");
            if(index1 != -1)
            {
                img中元素[i-1]=当前元素.replace(db路径, "/");//前面的路径用 / 代换
 //qDebug()<<"img这"<<img中元素[i-1]<<db路径;
                break;
            }
            i--;
        }
    }

    if(存储方式=="2")//等于2, 图片保留原路径. 资源截断, 复制到工作目录中.
    {
        i=img中元素.length();

        while(i)//得到 资源类型 和 存储方式;
        {
            QString 当前元素=img中元素[i-1];

            index1=当前元素.indexOf("title=\"");
            if(index1 != -1)
            {
                img中元素[i-1]=当前元素.replace(db路径, "/");//前面的路径用 / 代换
 //qDebug()<<"img这"<<img中元素[i-1]<<db路径;
                break;
            }
            i--;
        }
    }


    if(存储方式=="3")//等于3, 什么都不用改变.
    {
qDebug()<<"img kk"<<img标签<<返回标签;
       return 返回标签;

    }

    返回标签="<img ";
    for(int j=0; j<img中元素.length(); j++)
    {
        返回标签+=img中元素[j]+" ";
    }

    返回标签+= "/>";


    return 返回标签;
}


//db文件 只有得到db路径, 并未打开
QString img标签还原(QString db文件,QString img标签)
{
    QString 返回标签=img标签;//默认返回, 中途不能修改.

    int index1=-2;
    index1 = db文件.lastIndexOf("/");
    QString db路径=db文件.mid(0,index1+1);//后面的/ 号也加上

    int index2=-2;
//要编辑框中的格式 <img src=\"D:/QtF/SQLasBOOK/词典/photo/image.png\" title=\"音频1@D:/CloudMusic/夏天的风.mp3\" width=\"50\" height=\"20\" />  格式 0@ 1@ 2@ 3@
    QStringList img中元素;
    int i=0;
    while(1)//再拆分出img标签内的元素
    {
        index1 = img标签.indexOf(" ");
        index2 = img标签.indexOf("\"");
        img中元素.append(img标签.mid(index1+1,index2-index1));//空格与 " 号之间的字符串
        img标签=img标签.mid(index2+1,img标签.length()-index2-1);

        index2 = img标签.indexOf("\"");// " "之间的字符串
        img中元素[i]+=img标签.mid(0,index2+1);
        img标签=img标签.mid(index2+1,img标签.length()-index2-1);

    //    qDebug()<<"img=="<<img标签;
    //    qDebug()<<"img++"<<img中元素;

        i++;
        index2 = img标签.indexOf("\"");// 最后没有"号了,就退出
        if(index2 == -1) break;
    }

    i=img中元素.length();
    QString 存储方式;
    QString 资源类型;
    while(i)//得到 资源类型 和 存储方式;
    {
        QString 当前元素=img中元素[i-1];

        index1=当前元素.indexOf("title=\"");
        if(index1 != -1)
        {
            index2=当前元素.indexOf("@");
            if(index2 != -1)
            {
                资源类型=当前元素.mid(5,index2-5-1);
                存储方式=当前元素.mid(index2-1,1);
                break;
            }
        }
        i--;
    }



    if(存储方式=="0")//等于0, 图片和资源都要截断, 这里都要加入db路径.
    {
        i=img中元素.length();

        while(i)//得到 资源类型 和 存储方式;
        {
            QString 当前元素=img中元素[i-1];
            index1=-1;
            index1=当前元素.indexOf("src=\"");
            if(index1 != -1)
            {
                img中元素[i-1]=当前元素.replace("=\"/","=\""+db路径);//前面 ="/ 代换为 ="db路径
 //qDebug()<<"img src="<<img中元素[i-1]<<db路径;
            }

            index2=-1;
            index2=当前元素.indexOf("title=\"");
            if(index2 != -1)
            {
                img中元素[i-1]=当前元素.replace("@/","@"+db路径);//前面的 @/ 代换为 @db路径
 //qDebug()<<"img title="<<img中元素[i-1]<<db路径;
            }
            i--;
        }
    }
    else if(存储方式=="1")//等于1, 图片要加入db路径. 资源保留原路径.
    {
        i=img中元素.length();

        while(i)//得到 资源类型 和 存储方式;
        {
            QString 当前元素=img中元素[i-1];

            index1=当前元素.indexOf("src=\"");
            if(index1 != -1)
            {
                img中元素[i-1]=当前元素.replace("=\"/","=\""+db路径);//前面 ="/ 代换为 ="路径
 //qDebug()<<"img这"<<img中元素[i-1]<<db路径;
                break;
            }
            i--;
        }
    }

    else if(存储方式=="2")//等于2, 图片保留原路径. 资源要加入db路径
    {
        i=img中元素.length();

        while(i)//得到 资源类型 和 存储方式;
        {
            QString 当前元素=img中元素[i-1];

            index1=当前元素.indexOf("title=\"");
            if(index1 != -1)
            {
                img中元素[i-1]=当前元素.replace("@/","@"+db路径);//前面的 @/ 代换为 @db路径
 //qDebug()<<"img这"<<img中元素[i-1]<<db路径;
                break;
            }
            i--;
        }
    }

    else//(存储方式==3)//等于3, 什么都不用改变.
    {
       return 返回标签;
    }

    返回标签="<img ";
    for(int j=0; j<img中元素.length(); j++)
    {
        返回标签+=img中元素[j]+" ";
    }

    返回标签+= "/>";
qDebug()<<"img gg"<<返回标签;

    return 返回标签;
}

//返回值供QTextEdit显示
QString 词典词条像模板还原(QString ini文件, QString db文件, QString 表名, QString ID)
{
    QString html文本;

    QStringList ini第一行= ini读尖括号格式(ini文件, "<~>");//表的列名
    QStringList ini第二行= ini读尖括号格式(ini文件, "<`>");//ID递增方式和是否显示, 列间的换行

    if(ini第一行.length()<1)
    {
        return html文本="错误: ini文件的列名不存在";
    }
    if(ini第二行.length()<1)
    {
        return html文本="错误: ini文件的列名格式不存在";
    }

    QStringList 临时列表;
    QString 列名格式;
    QString ID格式;

    临时列表=ini读尖括号格式(ini文件, "<~~>");//得到列名的html格式
    if(临时列表.length())
    {   列名格式=临时列表[0];}

    临时列表.clear();
    临时列表=ini读尖括号格式(ini文件, "<~`>");//得到ID数字的html格式
    if(临时列表.length())
    {   ID格式=临时列表[0];  }


    QTextCodec::setCodecForLocale(QTextCodec::codecForLocale());
    QSqlDatabase db =QSqlDatabase::addDatabase("QSQLITE");//以“QSQLITE”为数据库类型，在本进程地址空间内创建一个SQLite数据库。

    db.setDatabaseName(db文件);              //设置数据库名
    db.open();
    if (!db.open()) {
        html文本 = "打开数据库失败";
        qDebug() << "ggg打开数据库失败";
        return html文本;
    }
    // 查询一条数据
    QSqlQuery query(db);

    int 不换行次数=0;
    QString 开头标签p;

    if(ini第一行.length()>0)
    {
       for(int i=0; i<ini第一行.length(); i++)
       {
            QString sql语句="SELECT "+ini第一行[i]+" FROM "+表名+" WHERE ID="+ID+";";
            query.exec(sql语句);//执行查询
            query.seek(0);//必须要将字段移到开头, 否则找不到记录内容.
            QString 暂时文本= query.value(0).toString();
            暂时文本=还原一行html(ini文件,暂时文本);

            if(ini第一行[i] == "ID")
            {
                html文本+=列名格式+"---ID\t"+ini第二行[0]+"----------------------------</span></p>\n";
                html文本+=ID格式+暂时文本+"</span></p>\n";//显示ID的值
            }
            else//一般的列名
            {
                html文本+=列名格式+"---"+ini第一行[i]+ini第二行[i]+"----------------------------</span></p>\n";

                //遇到不换行符 \ 要把<p > </P>标签加上.
                if(ini第二行[i]=="\\" &&  不换行次数 > 0)//第二个或以上 \ 号.     此条件必须放在第一个, 防止第二个成立.
                {
                    不换行次数++;
                    html文本+=开头标签p+暂时文本+"</p>\n";//此时前面没有<p >, 最后是没有</p>的, 要加上.
                }
                if(ini第二行[i]=="\\" &&  不换行次数==0)//第一个\号
                {
                    不换行次数=1;
                    int index = 暂时文本.indexOf(">");
                    开头标签p=暂时文本.mid(0,index+1);//将开头的<p>标签保存下来

                    html文本+=暂时文本+"</p>\n";//此时最后是没有</p>的, 要加上.
                }
                if(ini第二行[i]!="\\" &&  不换行次数 == 0)//前面的一行是没有出现 \ 号的.   此条件必须放在第三个, 防止第四个成立.
                {
                    html文本+=暂时文本+"\n";//默认的
                }
                if(ini第二行[i]!="\\" &&  不换行次数 > 0)//此时前面没有<p >,要加上.
                {
                    不换行次数=0;
                    html文本+=开头标签p+暂时文本+"\n";//默认的
                }
            }

            if(ini第一行.length() == i+ 1)//最后一行加上 ---\\ 结束符
            {
                html文本+=列名格式+"---\\\\----------------------------</span></p>\n";
            }
       }

    }
    db.close();
//qDebug()<<"html文本 bb"<<html文本;


    return html文本;
}

QString 还原一行html(QString ini文件, QString 缩标的html)
{
    QString 还原的html;
    QStringList 拆分的html=单行html元素拆分(缩标的html);

   // qDebug()<<"拆分的html pp"<<拆分的html;

    int index=ini文件.indexOf("tableSet");
    QString db文件路径=ini文件.mid(0,index+1);// 把 / 号也加上

    while(拆分的html.length())//这个while来源于函数: 表中还原html
    {
        int index1=-1;
        int index2 =-1;
        QString 截取的;
        index1 = 缩标的html.indexOf("<");
        index2 = 缩标的html.indexOf(">");

        if(index1== 0 && index1 < index2  )//找到的是<>的区间
        {
            截取的=缩标的html.mid(0 ,index2+1);

            int index3=截取的.indexOf("<img");
            if(index3 == -1)
            {
                QStringList 键值列表=ini读尖括号格式(ini文件, 截取的);
                if(键值列表.length())
                {
                    还原的html+=键值列表[0];
                }
                else
                {   还原的html+=截取的;    }
            }
            else//当前是<img标签
            {   还原的html+=img标签还原(db文件路径,截取的);    }


            缩标的html=缩标的html.mid(index2+1,缩标的html.length()-index2);//减去已截取的字符

        }
        if(index1> 0)//找到的不是<>区间
        {
            还原的html+=缩标的html.mid(0,index1);
            缩标的html=缩标的html.mid(index1,缩标的html.length()-index1);
        }
        if(index1< 0)//没有html标签
        {
            还原的html+=缩标的html;
            break;
        }
    }

     //qDebug()<<"一行还原bb"<<还原的html;


    return 还原的html;
}



QString 修改db词典词条(QString ini文件, QString db文件, QString 表名, QString ID, QString 文本)
{
    QString 返回信息;
    QStringList ini第一行= ini读尖括号格式(ini文件, "<~>");//表的列名
    QStringList ini第二行= ini读尖括号格式(ini文件, "<`>");//ID递增方式和是否显示, 列间的换行

    if(ini第一行.length()<1)
    {
        return 返回信息="错误: ini文件的列名不存在";
    }
    if(ini第二行.length()<1)
    {
        return 返回信息="错误: ini文件的列名格式不存在";
    }

    int index=ini第二行[0].indexOf("用户指定");
    QString 递增方式;
    if(index != -1)
    {   递增方式="用户指定"; }
    else
    {   递增方式="自动递增"; }


    // 按行分割文本
    QStringList 表内容 = 文本.split("\n");
    QStringList html元素;

   // QStringList ini第三行= ini读尖括号格式(ini文件, "<^>");//表的类型是词典还是笔记
    QString sql语句  ="UPDATE "+表名+" SET "; // 列名1='元素1', 列名2='元素2' WHERE ID=ID数字; p152页
    QStringList sql表列名列表;
    QStringList sql元素值列表;

    int 表内容第几行=0;
    QString 单个文本;

    //遍历整篇文件, 找到 ---ID 出现的位置, 即列名的位置
        for(; 表内容第几行<表内容.length(); 表内容第几行++)
        {
            html元素 = 单行html元素拆分(表内容[表内容第几行]);
            for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签
            {
                index=html元素[i].indexOf("---ID");
                if(index>=0 && index<2)//防止-号前有空格,也防止这行不是ID, 所以要加个小于2
                {
                    表内容第几行++;//到下一行找ID的值

                    index = -2;
                    html元素 = 单行html元素拆分(表内容[表内容第几行]);
                    for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签, 找出ID的数字
                    {
                        index=html元素[i].indexOf("<");
                        int index2=html元素[i].indexOf("---");
                        if(index == -1 && index2 ==-1)//找到的不是html标签了, 并且不存在--- 就当作有ID数字, 存在--- 当作是的列名行
                        {
                            单个文本=html元素[i].remove(QRegExp("\\s+"));  //去除所有空格
                            sql表列名列表.append("ID");
                            sql元素值列表.append(单个文本);//是数值, 不需要 ' ' 单引号
                            goto 找到第ID了;
                        }
                        if(index2 >0 && index2<2)//存在--- 当作是的列名行
                        {
                            sql表列名列表.append("ID");
                            sql元素值列表.append("0");//是数值, 不需要 ' ' 单引号
                            goto 找到第ID了;
                        }
                    }
                }
            }
        }
找到第ID了:
        表内容第几行++;//跳过ID格式行 或ID数字行
        QString 不换行符;
        int 不换行次数=0;
        bool 不是表列名=false;


   //     int SQL元素个数=0;
        //int 表列名行记数=-3;//给个负数, 用止应对表列名行连续

        //遍历整篇文件, 开始找列名
        for(; 表内容第几行<表内容.length();)//表内容第几行++)//)
        {

            html元素 = 单行html元素拆分(表内容[表内容第几行]);
            for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签, 这个是为了找到列名
            {
                index=-1;
                index=html元素[i].indexOf("---");
             //   qDebug()<<"修改aaa"<<index<<html元素[i];
                if(index>=0 && index<2)//防止-号前有空格,也防止这行不是ID, 所以要加个小于2
                {
                    单个文本=html元素[i].replace('-', ' ');  // - 号替换为空格
                    单个文本=单个文本.remove(QRegExp("\\s+"));  //去除所有空格

                    index=单个文本.indexOf("\\");
                    if(index >-1) 不换行符="\\";
                    else  不换行符="";


                    单个文本=单个文本.mid(0,index);//截取\号之前的

                    for(int j=0;j<ini第一行.length();j++)
                    {
                        if(单个文本 == ini第一行[j])//说明找到了列名
                        {
                            sql表列名列表.append(单个文本);;
                            不换行符=ini第二行[j];//可能为\号, 也可能为空
                          //  找到列名=true;

                            if(sql元素值列表.length()>1)//为上一行元素加上结尾的单引号,  最后一个 ' 由前面 ---\\ 找寻中加上
                            {
                                // 获取 sql元素值列表 最后一个元素
                                QString lastElement = sql元素值列表.last();
                                // 在最后一个元素末尾添加字符
                                lastElement += "'";
                                // 更新QStringList中的最后一个元素
                                sql元素值列表.replace(sql元素值列表.count() - 1, lastElement);
                            }

                            sql元素值列表.append("'");//为当前行的元素加上开头的单引号
                            goto 确认下一行是否表列名;
                           // break;
                        }
                    }

                }
            }

确认下一行是否表列名:
            //用来确认下一行不是 表列名
            ///用于确认后面不是表列名, 和找结束符 ---\\ .
            if(表内容第几行+1 == 表内容.length())
            {
                // 获取 sql元素值列表 最后一个元素
                QString lastElement = sql元素值列表.last();
                // 在最后一个元素末尾添加字符
                lastElement += "'";
                // 更新QStringList中的最后一个元素
                sql元素值列表.replace(sql元素值列表.count() - 1, lastElement);

                goto 全部找完了;
                qDebug()<<"全部找到了";
            }
            html元素 = 单行html元素拆分(表内容[表内容第几行++]);  //在这里自增
            for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签, 这个是为了找到列名
            {
                index=-1;
                index=html元素[i].indexOf("---\\\\");//  符号---\\是结束符
                if(index != -1)
                {
                    // 获取 sql元素值列表 最后一个元素
                    QString lastElement = sql元素值列表.last();
                    // 在最后一个元素末尾添加字符
                    lastElement += "'";
                    // 更新QStringList中的最后一个元素
                    sql元素值列表.replace(sql元素值列表.count() - 1, lastElement);

                    goto 全部找完了;
                    qDebug()<<"全部找到了";
                }


                不是表列名=true;
                index=-1;
                index=html元素[i].indexOf("---");
               // qDebug()<<"修改cgg"<<index<<html元素[i];
                if(index>=0 && index<2)//防止-号前有空格,也防止这行不是ID, 所以要加个小于2
                {
                    单个文本=html元素[i].replace('-', ' ');  // - 号替换为空格
                    单个文本=单个文本.remove(QRegExp("\\s+"));  //去除所有空格

                    index=单个文本.indexOf("\\");

                    单个文本=单个文本.mid(0,index);//截取\号之前的

                    for(int j=0;j<ini第一行.length();j++)
                    {
                        if(单个文本 == ini第一行[j])//说明找到了列名
                        {
                            不是表列名=false;
                            break;
                        }
                    }
                    break;//跳出 html元素[i] 的遍历
                }
            }

//qDebug()<<"修改erg"<<不是表列名<<sql表列名列表;

                if(不是表列名)//找到的不是 表列名
                {

                   // html元素 = 单行html元素拆分(表内容[表内容第几行]);

                    int 换行状态=0;
                    if(不换行符=="\\"  && 不换行次数 >0)//第二次或以上遇到不换行
                    {
                        换行状态 = 2;
                        不换行次数++;
                    }
                    if(不换行符=="\\"  && 不换行次数 ==0)//第一次遇到不换行. 必须把 换行状态 = 1 放到第二个if中
                    {
                        换行状态 = 1;
                        不换行次数++;
                    }
                    if(不换行符!="\\"  && 不换行次数 ==0)//没有遇到不换行
                    {
                        换行状态 = 0;
                        不换行次数=0;
                    }
                    if(不换行符!="\\"  && 不换行次数 >0)//最后一次遇到不换行. 必须把这条件放到最后, 不能跟 换行状态 = 0 的那个条件位置, 否则两次都执行到if语句, 换行状态只能是0
                    {
                        换行状态 = 3;
                        不换行次数=0;
                    }


                    ///  换行状态 = 1, 代表第一次遇到 \ 号, 则是截去最后的</p>
                    ///  换行状态 = 2,代表遇到几次了, 则是截去前面的<p>和后面的</p>
                    ///  换行状态 = 3, 代表终于最后一个同行, 则是截去前面<p>
                    ///  换行状态 = 0, 则是单独成行, 不用修改.
                    单个文本="";
                    for(int i=0 ; i<html元素.length(); i++)
                    {
                        单个文本+=html缩标存储方式(ini文件, db文件,html元素[i]);//db文件只是为了方便获得db的路径, 实际未写入db
                    }
                    if(换行状态)
                    {
                        if(换行状态==1)//则是截去最后的</p>
                        {
                            index=单个文本.lastIndexOf("<");
                            单个文本=单个文本.mid(0,index);
                        }
                        if(换行状态==2)//截去前面的<p>和后面的</p>
                        {
                            index=单个文本.indexOf(">");
                            单个文本=单个文本.mid(index+1,单个文本.length()-index-1);//截去前面的<p>
                            index=单个文本.lastIndexOf("<");
                            单个文本=单个文本.mid(0,index);//截去后面的</p>
                        }
                        if(换行状态==3)//截去前面的<p>
                        {
                            index=单个文本.indexOf(">");
                            单个文本=单个文本.mid(index+1,单个文本.length()-index-1);
                        }
                    }
//qDebug()<<"修改ads"<<表内容第几行<<单个文本;

                    // 获取 sql元素值列表 最后一个元素
                    QString lastElement = sql元素值列表.last();

                    单个文本=单个文本.replace("'", "''");  // 一个单引号替换为两个单引号, 避免写入sql时出错.
                    // 在最后一个元素末尾添加字符
                    lastElement += 单个文本;
                    // 更新QStringList中的最后一个元素
                    sql元素值列表.replace(sql元素值列表.count() - 1, lastElement);

                }




        }
//问题: 遇到空的元素, 能加入吗?

全部找完了:


    qDebug()<<"SQL列名aabb"<<sql表列名列表;
    qDebug()<<"SQL元素值aa"<<sql元素值列表;

   //例子:    QString sql语句  ="UPDATE 表名 SET  列名1='元素1', 列名2='元素2' WHERE ID=ID数字;

   if(递增方式=="用户指定")
   {
        for(int i=0; i<sql表列名列表.length();i++)
        {
            sql语句+=sql表列名列表[i]+"="+sql元素值列表[i];
            if(i+1 != sql表列名列表.length())
            {   sql语句+=", ";    }//为不是最后一个元素添加逗号和空格
        }

   }

   if(递增方式=="自动递增")
   {
        for(int i=1; i<sql表列名列表.length();i++)
        {
            sql语句+=sql表列名列表[i]+"="+sql元素值列表[i];
            if(i+1 != sql表列名列表.length())
            {   sql语句+=", ";    }//为不是最后一个元素添加逗号和空格
        }
   }

   sql语句+=" WHERE ID="+ID+";";


   sql写操作(db文件, sql语句);




    return 返回信息;
}


QString 修改db笔记词条(QString ini文件, QString db文件, QString 表名, QString ID, QString 文本)
{
    QString 返回信息;

    // 按行分割文本
    QStringList 表内容 = 文本.split("\n");

    if(!表内容.length())
    {    return 返回信息="错误, 没有输入内容";  }

    QStringList html元素;

    int 表内容第几行=0;
    QString 标题="";
    ///这个for循环是找标题的
    int index=-1;
    int 第几号;
    for(; 表内容第几行<表内容.length(); 表内容第几行++)//遍历整篇文件
    {
        html元素 = 单行html元素拆分(表内容[表内容第几行]);
        for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签,  找到左P的位置
        {
             index=html元素[i].indexOf("<p ");
             if(index != -1)
             {
                 第几号=i;
                 break;
             }
        }

        if(index != -1)
        {
            for(int i=第几号 ; i<html元素.length(); i++)//遍历一行html元素标签,  将这行元素全部写入
           {
               标题+=html缩标存储方式(ini文件, db文件,html元素[i]);
           }
           表内容第几行++;
           break;
        }
    }


    QString 正文="";

    if(表内容.length()>1)
    {
       for(; 表内容第几行<表内容.length(); 表内容第几行++)//遍历整篇文件
        {
            html元素 = 单行html元素拆分(表内容[表内容第几行]);
            for(int i=0 ; i<html元素.length(); i++)//遍历一行html元素标签
            {
                if(html元素[i] != "</body>")
                {
                     正文+=html缩标存储方式(ini文件, db文件,html元素[i]);
                }
                else
                {    break;}
            }
        }

    }

    标题=标题.replace("'", "''");  // 一个单引号替换为两个单引号, 避免写入sql时出错.
    正文=正文.replace("'", "''");  // 一个单引号替换为两个单引号, 避免写入sql时出错.


    QString sql语句  ="UPDATE "+表名+" SET 标题='" +标题+"', 正文='"+正文+ "' WHERE ID="+ID; //p152页

    sql写操作(db文件, sql语句);


    return 返回信息="修改成功";
}




